package com.xylx.interview.loadbalance;

import java.util.*;

/**
 * 负载均衡算法
 * <p>
 * 如果某一台服务器性能比较高，设置访问的权重高一点
 * <p>
 * 加权随机算法
 */
public class WeightRandomServer {

    public static Map<String, Integer> map = new HashMap<>();

    static {
        map.put("10.180.11.126:8888", 2);
        map.put("10.180.11.128:8888", 7);
        map.put("10.180.11.130:8888", 1);
    }

    static Random random = new Random();

    /**
     * 当权重设置过大时，list容易被撑爆
     *
     * @return
     */
    public static String getServer() {
        List<String> list = new ArrayList<>();

        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            //根据权重，决定向list中添加几次
            for (int i = 0; i < entry.getValue(); i++) {
                list.add(entry.getKey());
            }
        }

        //list的大小
        int weight = map.values().stream().mapToInt(p -> p).sum();
        int number = random.nextInt(weight);
        return list.get(number);
    }

    /**
     * 优化后
     *
     * @return
     */
    public static String getServer1() {
        //计算总权值
        int weight = map.values().stream().mapToInt(p -> p).sum();

        //随机一个随机数
        int index = random.nextInt(weight);

        //遍历  服务  map
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            //如果权重大于  索引
            if (entry.getValue() >= index) {
                // 返回这个服务
                return entry.getKey();
            }

            //否则，索引 = 当前索引 - 当前服务的权重
            index = index - entry.getValue();
        }

        return "";
    }

    public static void main(String[] args) {
        for (int i = 0; i < 15; i++) {
            //System.out.println(getServer());
            System.out.println(getServer1());
        }
    }
}